// 32 50胜率，可以返回来计算一下了哈！

const _ = require('lodash')
const fs = require('fs')
const NP = require('number-precision')
const path = require('path')
const ROOT_DIR = path.join(__dirname, '..')
const HELPERS_DIR = path.join(ROOT_DIR, 'helpers')
const { readAllValues } = require(path.join(HELPERS_DIR, 'readAllValues.js'))

// 读取数据
const allValues = readAllValues('m') // 假设返回的是历史数据数组
const historyData = allValues

// 切分数据
const initialData = historyData.slice(0, 100) // 前 100 期，用于初始化遗漏值和热号分析
const remainingData = historyData.slice(100) // 剩余期数，用于逐期预测和验证

// 初始化号码的遗漏值
const maxNumber = 49 // 假设六合彩号码范围是 1-49
const omissionValues = _.mapValues(
  _.keyBy(_.range(1, maxNumber + 1), (num) => num.toString().padStart(2, '0')),
  () => 0
)

// 使用前 100 期初始化遗漏值
_.forEach(initialData, (entry) => {
  const currentNumber = entry.number
  // 更新所有号码的遗漏值
  _.forEach(omissionValues, (value, number) => {
    if (number === currentNumber) {
      omissionValues[number] = 0 // 如果号码出现，遗漏值重置为 0
    } else {
      omissionValues[number]++ // 否则遗漏值加 1
    }
  })
})

// 统计预测结果
let correctPredictions = 0 // 预测正确的次数
let totalPredictions = 0 // 总预测次数

// 从第 101 期开始，逐期更新遗漏值并预测下一期
_.forEach(remainingData, (entry, index) => {
  const currentNumber = entry.number

  // 1. 使用遗漏值选择前 16 个号码
  const omissionPredictedNumbers = _.chain(omissionValues)
    .toPairs() // 将对象转换为 [key, value] 数组
    .orderBy(([_, value]) => value, 'desc') // 按遗漏值降序排序
    .take(16) // 取前 16 个
    .map(([number]) => number) // 提取号码
    .value()

  // 2. 使用全局历史数据统计热号，选择前 16 个热号
  const numberCounts = _.countBy(historyData.slice(0, index + 100), 'number') // 统计号码出现次数
  const hotPredictedNumbers = _.chain(numberCounts)
    .toPairs()
    .orderBy([1], ['desc']) // 按出现次数降序排序
    .take(16) // 取前 16 个
    .map(([number]) => number) // 提取号码
    .value()

  // 3. 合并两个算法的预测结果
  const predictedNumbers = _.union(omissionPredictedNumbers, hotPredictedNumbers)

  // 判断当前期的开奖号码是否包含在预测号码中
  if (predictedNumbers.includes(currentNumber)) {
    correctPredictions++
  }
  totalPredictions++

  // 更新所有号码的遗漏值（基于当前期的开奖号码）
  _.forEach(omissionValues, (value, number) => {
    if (number === currentNumber) {
      omissionValues[number] = 0 // 如果号码出现，遗漏值重置为 0
    } else {
      omissionValues[number]++ // 否则遗漏值加 1
    }
  })

  // 输出当前期的预测结果
  console.log(
    `第 ${index + 101} 期预测号码（遗漏值前 16 + 热号前 16）:`,
    predictedNumbers,
    `是否命中: ${predictedNumbers.includes(currentNumber) ? '是' : '否'}`
  )
})

// 输出预测准确率
const accuracy = (correctPredictions / totalPredictions) * 100
console.log(`预测准确率: ${accuracy.toFixed(2)}%`)
